/**
  ********************************  STM32F0xx  *********************************
  * @文件名     ： spi.c
  * @作者       ： strongerHuang
  * @库版本     ： V1.5.0
  * @文件版本   ： V1.0.0
  * @日期       ： 2016年06月04日
  * @摘要       ： SPI源文件
  ******************************************************************************/
/*----------------------------------------------------------------------------
  更新日志:
  2016-06-04 V1.0.0:初始版本
  ----------------------------------------------------------------------------*/
/* 包含的头文件 --------------------------------------------------------------*/
#include "spi.h"


/************************************************
函数名称 ： SPI_GPIO_Configuration
功    能 ： SPI引脚配置
参    数 ： 无
返 回 值 ： 无
作    者 ： strongerHuang
*************************************************/
void SPI_GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  /*定义 SPI复用引脚 */
  GPIO_InitStructure.GPIO_Pin = PIN_SPI_SCK | PIN_SPI_MISO | PIN_SPI_MOSI;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;                       //复用模式
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                  //高速输出
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;                     //推完输出
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;                       //上拉
  GPIO_Init(PORT_SPI_SCK, &GPIO_InitStructure);

  /* 片选CS */
	/*
  GPIO_InitStructure.GPIO_Pin = PIN_SPI_CS;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;                      //输出模式
  GPIO_Init(PORT_SPI_CS, &GPIO_InitStructure);
	*/
	//片选CS接地就好
	GPIO_SetBits(GPIOB,GPIO_Pin_8);

  GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_0);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_0);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_0);
}

/************************************************
函数名称 ： SPI_Configuration
功    能 ： SPI配置
            SPI为主模式，时钟线平时为低，上升沿采集数据
            8位数据格式，软件控制片选，数据高位在前
参    数 ： 无
返 回 值 ： 无
作    者 ： strongerHuang
*************************************************/
void SPI_Configuration(void)
{
  SPI_InitTypeDef  SPI_InitStructure;

  /* SPI 初始化定义 */
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //SPI设置为双线双向全双工
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                      //设置为主 SPI
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                  //SPI发送接收 8 位帧结构
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;                        //时钟悬空高
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;                       //数据捕获于第二个时钟沿
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                          //软件控制 NSS 信号
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2; //波特率预分频值为2
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;                 //数据传输从 MSB 位开始
  SPI_InitStructure.SPI_CRCPolynomial = 7;                           //定义了用于 CRC值计算的多项式
  SPI_Init(SPI1, &SPI_InitStructure);

  SPI_RxFIFOThresholdConfig(SPI1, SPI_RxFIFOThreshold_QF);
  SPI_Cmd(SPI1, ENABLE);                                             //使能 SPI1
}

/************************************************
函数名称 ： SPI_Initializes
功    能 ： SPI初始化
参    数 ： 无
返 回 值 ： 无
作    者 ： strongerHuang
*************************************************/
void SPI_Initializes(void)
{
  SPI_GPIO_Configuration();
  SPI_Configuration();
}

/************************************************
函数名称 ： SPI_WriteReadByte
功    能 ： 对SPI写读字节数据
参    数 ： TxData --- 发送的字节数据
返 回 值 ： 读回来的字节数据
作    者 ： strongerHuang
*************************************************/
uint8_t SPI_WriteReadByte(uint8_t TxData)
{
  while((SPI1->SR & SPI_I2S_FLAG_TXE) == (uint16_t)RESET);
  SPI_SendData8(SPI1, TxData);

  while((SPI1->SR & SPI_I2S_FLAG_RXNE) == (uint16_t)RESET);
  return SPI_ReceiveData8(SPI1);
}


/**** Copyright (C)2016 strongerHuang. All Rights Reserved **** END OF FILE ****/
